home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -in_the_mag- / emulation / amiga / uae-0.7.0b2 / src / od-win32 / exectasks.h next >
C/C++ Source or Header  |  1998-01-20  |  1KB  |  50 lines

  1.  /*
  2.   * UAE - The Un*x Amiga Emulator
  3.   *
  4.   * Stack magic definitions for autoconf.c
  5.   *
  6.   * Copyright 1997 Bernd Schmidt
  7.   */
  8.  
  9. #include <setjmp.h>
  10.  
  11. #undef CAN_DO_STACK_MAGIC
  12.  
  13. #if defined __GNUC__ && defined __GNUC_MINOR__
  14. #if defined __i386__ && (__GNUC__ > 2 || __GNUC_MINOR__ >= 7)
  15. #define CAN_DO_STACK_MAGIC
  16. #endif
  17. #endif
  18.  
  19. #ifdef CAN_DO_STACK_MAGIC
  20. static inline void transfer_control(void *, int, void *, void *, int) __attribute__((noreturn));
  21. static inline void transfer_control(void *s, int size, void *pc, void *f, int has_retval)
  22. {
  23.     unsigned long *stacktop = (unsigned long *)((char *)s + size - 20);
  24.     stacktop[0] = 0xC0DEDBAD; /* return address */
  25.     stacktop[1] = (int)s; /* function arg 1: stack */
  26.     stacktop[2] = (int)f; /* function arg 2: trap function */
  27.     stacktop[3] = (int)stacktop; /* function arg 3: return value address */
  28.     stacktop[4] = has_retval;
  29.     __asm__ __volatile__ ("movl %0,%%esp\n\tpushl %1\n\tret\n" : : "r" (stacktop), "r" (pc) : "memory");
  30.     /* Not reached. */
  31.     abort();
  32. }
  33.  
  34. static inline uae_u32 get_retval_from_stack (void *s, int size)
  35. {
  36.     return *(uae_u32 *)((char *)s + size - 20);
  37. }
  38.  
  39. static inline int stack_has_retval (void *s, int size)
  40. {
  41.     return *(int *)((char *)s + size - 4);
  42. }
  43.  
  44. #define USE_EXECLIB
  45.  
  46. #else
  47.  
  48. #endif
  49.  
  50.